home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / flying-6.11 / dynobj.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-30  |  2.7 KB  |  105 lines

  1. #ifndef _global_h
  2. #    include "global.h"
  3. #endif
  4.  
  5. #ifndef _dynobj_h
  6. #    include "dynobj.h"
  7. #endif
  8. #ifndef _ball_h
  9. #    include "ball.h"
  10. #endif
  11.  
  12. //
  13. // Statik der DynObj-Klasse
  14. //
  15. Ball        *DynObj::hit_ball=0l;        // an Kollision beteiligter Ball
  16. Object     *DynObj::hit_object=0l;        // weiteres an Kollision beteiligtes Objekt
  17. DynObj     *DynObj::dyn_queue = 0l;    // globale Liste der dynamischen Objekte
  18. int         DynObj::id_count = 0;        // aktuelle Objekt-Id
  19.  
  20. DynObj::DynObj() {
  21.     id = id_count++;                // muss von der Unterklasse gelesen werden
  22.     next = dyn_queue;        // alle Objekte in dynamische Liste ketten
  23.     dyn_queue = this;
  24.     idle=0;
  25. }
  26.  
  27. DynObj::~DynObj() {
  28. DynObj    *last;
  29.  
  30.     if ( dyn_queue == this )        dyn_queue = next;
  31.     else {
  32.         last = dyn_queue;            // Element in Dynamik-Liste suchen ...
  33.         while ( last->next && last->next != this )    last = last->next;
  34.         last->next = next;        // Element ausketten
  35.     }
  36. }
  37. void DynObj::ForAllDyn( DynObjFun fun ) {
  38.         for (DynObj *obj=dyn_queue; obj; obj=obj->next )    (obj->*fun)();
  39. }
  40. void DynObj::ForAllDyn( DynObjFunD fun, Real param ) {
  41.        for (DynObj *obj=dyn_queue; obj; obj=obj->next )    (obj->*fun)(param);
  42. }
  43.  
  44. //
  45. // CollisionAll
  46. // -  Der naechste Collisionszeitpunkt soll bestimmt werden.
  47. // -  Dazu wird jedes dynamische Objekt nach der naechsten Kollision befragt.
  48. // -  Die Zeit wird ermittelt, indem sich das das Objekt an alle anderen Objekte
  49. //    wendet und danach befragt, wann sie getroffen werden.
  50. //
  51. Real DynObj::CollisionAll() {
  52.  
  53.     Object::min_time = MAX_TIME;
  54.     for (DynObj *obj=dyn_queue; obj; obj=obj->next )
  55.         obj->NextCollision();
  56.     return (Object::min_time<MAX_TIME)?Object::min_time-current_time:Real(MAX_TIME);
  57. }
  58.  
  59. void DynObj::DynInitAll() {    ForAllDyn(&DynObj::DynInit);    }
  60.  
  61. void DynObj::DynEndAll() {
  62. }
  63.  
  64. void DynObj::DynInit() {
  65. #if (TIME_CACHE)
  66.     col_objects = Object::id_count;
  67.     obj_list.Init(col_objects);
  68.     for (Object *obj=Object::stat_queue; obj; obj=obj->next )
  69.             obj_list[obj->id] = obj;
  70. #endif
  71. }
  72.  
  73. //
  74. // Collide
  75. // Die Kollision an dem durch HitFromBallAll gefundenen Objekt findet statt.
  76. //
  77. void DynObj::Collide() {
  78.     if (Object::min_time<MAX_TIME) {
  79. #ifdef DEBUG
  80.         if (debug&BeforCollision) {
  81.               printf( "BEFOR: %9.5f, Collision %9.5f\n", current_time,
  82.                                                     (double)Object::min_time );
  83.              hit_object->Info();
  84.             hit_ball->Info();
  85.         }
  86. #endif
  87.         hit_object->CollideWithBall( hit_ball );
  88.         hit_ball->WasHit(hit_object);
  89. #ifdef DEBUG
  90.         if (debug&AfterCollision) {
  91.               if (debug&BeforCollision)     printf( "AFTER:\n" );
  92.             else        printf( "AFTER: %9.5f, Collision %9.5f\n", current_time,
  93.                                                     (double)Object::min_time );
  94.            hit_object->Info();
  95.            hit_ball->Info();
  96.         }
  97. #endif
  98.     }
  99. }
  100.  
  101.  
  102. void DynObj::Move( Real )        { }
  103. void DynObj::Reset()                { }
  104. void DynObj::Redraw()            { }
  105.